/**
 * 股票每日跟踪数据API接口
 */

import { apiClient } from './http-client'
import { ApiResponse } from '../types/api'

/**
 * 每日记录数据结构
 */
export interface DailyRecord {
  date: string                  // 日期
  days: number                  // 持仓天数
  buyPrice: number              // 买入价
  closePrice: number            // 收盘价
  dailyReturn: number           // 当日收益率
  cumulativeReturn: number      // 累计收益率
  volume: number                // 成交量
  prevVolume: number            // 前日成交量
  volumeRatio: number           // 量比
  volumeChange: string          // 成交量变化描述
  signalStrength: number        // 信号强度
  signalReason: string          // 信号原因
  signalCount: number           // 信号数量
  marketIndexReturn: number     // 大盘收益率
  marketStatus: string          // 大盘状态
  outperformMarket: boolean     // 是否跑赢大盘
  status: string                // 状态
  isEnd: boolean                // 是否结束
}

/**
 * 信号分布统计
 */
export interface SignalDistribution {
  signalName: string            // 信号名称
  appearanceCount: number       // 出现次数
  avgReturn: number             // 平均收益率
  winRate: number               // 该信号的胜率
}

/**
 * 汇总统计数据
 */
export interface TrackingSummary {
  totalDays: number             // 总持仓天数
  observationProgress?: string  // 观察进度 (如 "14/10")
  cumulativeReturn: number      // 累计收益率
  bestDayReturn?: number        // 最佳单日收益
  worstDayReturn?: number       // 最差单日收益
  winRate: number               // 胜率
  winDays?: number              // 盈利天数
  lossDays?: number             // 亏损天数
  avgSignalStrength?: number    // 平均信号强度
  marketOutperformDays?: number // 跑赢大盘天数
  totalVolume?: number          // 总成交量
  avgVolume?: number            // 平均成交量
  signalDistribution?: SignalDistribution[]  // 信号分布统计
}

/**
 * 股票每日跟踪数据
 */
export interface StockTrackingData {
  code: string                  // 股票代码
  name: string                  // 股票名称
  firstBuyDate: string          // 首次买入日期
  observationPeriod: number     // 观察期（天数）
  currentStatus: string         // 当前状态
  summary: TrackingSummary      // 汇总统计
  dailyRecords: DailyRecord[]   // 每日记录
}

/**
 * 观察周期信息（后台返回的原始数据结构）
 */
export interface ObservationCycleRaw {
  cycle_index: number           // 周期索引
  start_date: string            // 起始日期
  end_date: string              // 结束日期
  status: string                // 状态（活跃/已结束）
  days_count: number            // 天数
  is_current: boolean           // 是否当前周期
}

/**
 * 观察周期信息（前端使用的数据结构）
 */
export interface ObservationCycle {
  cycleIndex: number            // 周期索引
  startDate: string             // 起始日期
  endDate: string               // 结束日期
  status: string                // 状态（活跃/已结束）
  daysCount: number             // 天数
  isCurrent: boolean            // 是否当前周期
}

/**
 * 转换周期数据为前端使用的格式
 */
export function convertCycleData(raw: ObservationCycleRaw): ObservationCycle {
  return {
    cycleIndex: raw.cycle_index,
    startDate: raw.start_date,
    endDate: raw.end_date,
    status: raw.status,
    daysCount: raw.days_count,
    isCurrent: raw.is_current,
  }
}

/**
 * 获取股票所有观察周期列表
 * @param stockCode 股票代码
 * @returns Promise<ApiResponse<ObservationCycle[]>>
 */
export const getStockCycles = async (stockCode: string): Promise<ApiResponse<ObservationCycle[]>> => {
  const response = await apiClient.get<ObservationCycleRaw[]>(`/api/stocks/${stockCode}/cycles`)
  
  // 转换数据格式
  if (response.data && Array.isArray(response.data)) {
    return {
      ...response,
      data: response.data.map(convertCycleData)
    }
  }
  
  return {
    ...response,
    data: []
  }
}

/**
 * 获取股票每日跟踪数据参数
 */
export interface GetDailyTrackingParams {
  startDate?: string            // 起始日期（可选，用于筛选特定周期）
  endDate?: string              // 结束日期（可选，用于筛选特定周期）
  allCycles?: boolean           // 是否查询所有周期（可选，true时忽略日期参数）
}

/**
 * 获取股票每日跟踪数据
 * @param stockCode 股票代码
 * @param params 查询参数（包含起始日期、结束日期或查询所有周期）
 * @returns Promise<ApiResponse<StockTrackingData>>
 */
export const getStockDailyTracking = async (
  stockCode: string,
  params?: GetDailyTrackingParams
): Promise<ApiResponse<StockTrackingData>> => {
  const queryParams = new URLSearchParams()
  
  if (params?.allCycles) {
    // 查询所有周期
    queryParams.append('all_cycles', 'true')
  } else {
    // 查询特定周期
    if (params?.startDate) {
      queryParams.append('start_date', params.startDate)
    }
    if (params?.endDate) {
      queryParams.append('end_date', params.endDate)
    }
  }
  
  const queryString = queryParams.toString()
  const url = `/api/stocks/${stockCode}/daily-tracking${queryString ? `?${queryString}` : ''}`
  
  return await apiClient.get<StockTrackingData>(url)
}

/**
 * 信号有效性分析结果
 */
export interface SignalAnalysisResult {
  signalName: string            // 信号名称
  totalCount: number            // 总交易次数
  winCount: number              // 盈利次数
  lossCount: number             // 亏损次数
  winRate: number               // 胜率
  avgReturns: {                 // 各周期平均收益（1-30天）
    [key: string]: number       // key为天数，value为收益率
  }
  maxReturn: number             // 最大收益
  maxLoss: number               // 最大亏损
  volatility: number            // 波动率
  sharpeRatio: number           // 夏普比率
  avgHoldingDays: number        // 平均持仓天数
  ratingScore: number           // 评分
  ratingLevel: string           // 评级等级 (S/A/B/C/D)
}

/**
 * 信号分析API参数
 */
export interface GetSignalAnalysisParams {
  startDate?: string            // 起始日期（可选）
  endDate?: string              // 结束日期（可选）
  period?: number               // 分析周期天数（可选，默认1，范围1-30）
}

/**
 * 获取所有交易信号有效性分析
 * @param params 查询参数（可选的起始和结束日期）
 * @returns Promise<ApiResponse<SignalAnalysisResult[]>>
 */
export const getSignalAnalysis = async (
  params?: GetSignalAnalysisParams
): Promise<ApiResponse<SignalAnalysisResult[]>> => {
  const queryParams = new URLSearchParams()
  
  if (params?.startDate) {
    queryParams.append('start_date', params.startDate)
  }
  if (params?.endDate) {
    queryParams.append('end_date', params.endDate)
  }
  if (params?.period) {
    queryParams.append('period', params.period.toString())
  }
  
  const queryString = queryParams.toString()
  const url = `/api/signals/analysis${queryString ? `?${queryString}` : ''}`
  
  return await apiClient.get<SignalAnalysisResult[]>(url)
}

/**
 * 信号交易明细数据（前端使用）
 */
export interface SignalTradeDetail {
  stockCode: string             // 股票代码
  stockName: string             // 股票名称
  buyDate: string               // 买入日期
  buyPrice: number              // 买入价格
  sellDate: string              // 卖出日期
  sellPrice: number             // 卖出价格
  holdingDays: number           // 持仓天数
  returnRate: number            // 收益率
  signalName: string            // 信号名称（简化版）
  signalDescription: string     // 原始信号描述（完整版）
  isWin: boolean                // 是否盈利
}

/**
 * 后台返回的原始交易数据格式
 */
interface SignalTradeRaw {
  id: number
  code: string                  // 股票代码
  name: string                  // 股票名称
  buyDtm: string               // 买入日期 (YYYY-MM-DD)
  buyJiage: number             // 买入价格
  sellDtm: string | null       // 卖出日期 (可能为null，未卖出)
  sellJiage: number | null     // 卖出价格 (可能为null，未卖出)
  isend: string                // 是否结束 ("Y"/"N")
  holdingDays: number          // 持仓天数
  t1Return: number | null      // T+1收益率
  t3Return: number | null      // T+3收益率
  t5Return: number | null      // T+5收益率
  maxReturn: number | null     // 最大收益率
  maxDrawdown: number | null   // 最大回撤
  signals: string              // 信号名称（简化版）
  rawSignals: string           // 原始信号描述（完整版）
}

/**
 * 后台返回的分页数据格式
 */
export interface SignalTradesPaginatedResponse {
  total: number                // 总记录数
  page: number                 // 当前页
  pageSize: number             // 每页大小
  totalPages: number           // 总页数
  data: SignalTradeRaw[]       // 当前页数据
}

/**
 * 转换后台数据为前端格式
 */
export function convertTradeData(raw: SignalTradeRaw): SignalTradeDetail {
  // 计算收益率：优先使用maxReturn，如果为null则为0
  const returnRate = raw.maxReturn !== null ? raw.maxReturn : 0
  
  // 使用 signals 作为信号名称（已经是简化版本）
  const signalName = raw.signals || ''
  
  // 使用 rawSignals 作为完整的信号描述
  const signalDescription = raw.rawSignals || raw.signals || ''
  
  return {
    stockCode: raw.code,
    stockName: raw.name,
    buyDate: raw.buyDtm || '',
    buyPrice: raw.buyJiage || 0,
    sellDate: raw.sellDtm || '持仓中',  // 如果没有卖出日期，显示"持仓中"
    sellPrice: raw.sellJiage || raw.buyJiage,  // 如果没有卖出价格，显示买入价格
    holdingDays: raw.holdingDays || 0,
    returnRate: returnRate,
    signalName: signalName,
    signalDescription: signalDescription,
    isWin: returnRate >= 0,
  }
}

/**
 * 信号交易明细查询参数
 */
export interface GetSignalTradesParams {
  signalName: string            // 信号名称（必填）
  startDate?: string            // 起始日期（可选）
  endDate?: string              // 结束日期（可选）
  page?: number                 // 页码（可选，默认1）
  pageSize?: number             // 每页大小（可选，默认50）
}

/**
 * 获取信号交易明细（返回分页数据和元信息）
 * @param params 查询参数（必须包含信号名称）
 * @returns Promise<带分页信息的响应>
 */
export const getSignalTrades = async (
  params: GetSignalTradesParams
): Promise<ApiResponse<SignalTradesPaginatedResponse>> => {
  const queryParams = new URLSearchParams()
  
  // 信号名称是必填参数
  queryParams.append('signal_name', params.signalName)
  
  if (params.startDate) {
    queryParams.append('start_date', params.startDate)
  }
  if (params.endDate) {
    queryParams.append('end_date', params.endDate)
  }
  
  // 分页参数（默认每页50条）
  const pageSize = params.pageSize || 50
  const page = params.page || 1
  queryParams.append('page', page.toString())
  queryParams.append('page_size', pageSize.toString())
  
  const queryString = queryParams.toString()
  const url = `/api/signals/trades?${queryString}`
  
  // 请求指定页数据
  const response = await apiClient.get<SignalTradesPaginatedResponse>(url)
  
  return response
}

/**
 * 跟踪数据API接口对象
 */
export const trackingApi = {
  getStockDailyTracking,
  getStockCycles,
  getSignalAnalysis,
  getSignalTrades,
}

